/*
 * @lc app=leetcode.cn id=1232 lang=java
 *
 * [1232] 缀点成线
 */

// @lc code=start
class Solution {
    //写的麻烦了，总的来说还是用斜率来判断在不在一条线上，注意垂直竖线斜率为INF，需要单独处理一下。
    //注意引入斜率之后必定会产生浮点数，其实不太好。
    public boolean checkStraightLine(int[][] coordinates) {
        if(coordinates.length==2) return true;
        //先用前两个点确定一个方程
        //另外有为竖直线的情况，这种情况下斜率不好求。
        boolean f = false;
        double k = 1;
        if(coordinates[0][0]==coordinates[1][0]){
            f = true;
        }
        else{
            k = (double) (coordinates[0][1]-coordinates[1][1])/(coordinates[0][0]-coordinates[1][0]);
        }
        for (int i = 2; i < coordinates.length; i++) {
            if(!f && coordinates[i][0]==coordinates[i-1][0] ){
                return false;
            }
            else if(!f && k!= (double) (coordinates[i][1]-coordinates[i-1][1])/(coordinates[i][0]-coordinates[i-1][0])){
                return false;
            }
            else if(f && coordinates[i][0]!=coordinates[i-1][0]){
                return false;
            }
        }
        return true;
    }
    /**
     * 官方解法
     * @param coordinates
     * @return boolen
     */
    public boolean checkStraightLine1(int[][] coordinates) {
        int deltaX = coordinates[0][0], deltaY = coordinates[0][1];//第一个点
        int n = coordinates.length;
        //其他点都向他偏移，这样可以把第一个点变成坐标轴原点
        for (int i = 0; i < n; i++) {
            coordinates[i][0] -= deltaX;
            coordinates[i][1] -= deltaY;
        }
        // 两点确定一条直线，由于过原点，于是有Ax+By=0（不使用斜率K，避免斜率INF的情况）
        // 又由于过第二个点，所以可以得出系数
        int A = coordinates[1][1], B = -coordinates[1][0];
        for (int i = 2; i < n; i++) {
            int x = coordinates[i][0], y = coordinates[i][1];
            if (A * x + B * y != 0) {
                return false;
            }
        }
        return true;
    }
}
// @lc code=end

